package com.yehongyu.mytools.dom.xml;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Vector;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.crimson.tree.XmlDocument;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

public class W3cDom {
	Vector<StudentBean> student_Vector = new Vector<StudentBean>();

	private void readXMLFile(String inFile) throws Exception {
		// 为解析XML作准备，创建DocumentBuilderFactory实例,指定DocumentBuilder
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = null;
		try {
			db = dbf.newDocumentBuilder();
		} catch (ParserConfigurationException pce) {
			System.err.println(pce); // 出异常时输出异常信息，然后退出，下同
			System.exit(1);
		}

		Document doc = null;
		try {
			doc = db.parse(inFile);
		} catch (DOMException dom) {
			System.err.println(dom.getMessage());
			System.exit(1);
		} catch (IOException ioe) {
			System.err.println(ioe);
			System.exit(1);
		}
		// 下面是解析XML的全过程，比较简单，先取根元素"学生花名册"
		Element root = doc.getDocumentElement();
		// 取"学生"元素列表
		NodeList students = root.getElementsByTagName("学生");
		for (int i = 0; i < students.getLength(); i++) {
			// 依次取每个"学生"元素
			Element student = (Element) students.item(i);
			// 创建一个学生的Bean实例
			StudentBean studentBean = new StudentBean();
			// 取学生的性别属性
			studentBean.setSex(student.getAttribute("性别"));
			// 取"姓名"元素，下面类同
			NodeList names = student.getElementsByTagName("姓名");
			if (names.getLength() == 1) {
				Element e = (Element) names.item(0);
				Text t = (Text) e.getFirstChild();
				studentBean.setName(t.getNodeValue());
			}

			NodeList ages = student.getElementsByTagName("年龄");
			if (ages.getLength() == 1) {
				Element e = (Element) ages.item(0);
				Text t = (Text) e.getFirstChild();
				studentBean.setAge(Integer.parseInt(t.getNodeValue()));
			}

			NodeList phones = student.getElementsByTagName("电话");
			if (phones.getLength() == 1) {
				Element e = (Element) phones.item(0);
				Text t = (Text) e.getFirstChild();
				studentBean.setPhone(t.getNodeValue());
			}

			student_Vector.add(studentBean);
		}
	}

	private void writeXMLFile(String outFile) throws Exception {
		// 为解析XML作准备，创建DocumentBuilderFactory实例,指定DocumentBuilder
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = null;
		try {
			db = dbf.newDocumentBuilder();
		} catch (ParserConfigurationException pce) {
			System.err.println(pce);
			System.exit(1);
		}

		Document doc = null;
		doc = db.newDocument();

		// 下面是建立XML文档内容的过程，先建立根元素"学生花名册"
		Element root = doc.createElement("学生花名册");
		// 根元素添加上文档
		doc.appendChild(root);

		// 取学生信息的Bean列表
		for (int i = 0; i < student_Vector.size(); i++) {
			// 依次取每个学生的信息
			StudentBean studentBean = (StudentBean) student_Vector.get(i);
			// 建立"学生"元素，添加到根元素
			Element student = doc.createElement("学生");
			student.setAttribute("性别", studentBean.getSex());
			root.appendChild(student);
			// 建立"姓名"元素，添加到学生下面，下同
			Element name = doc.createElement("姓名");
			student.appendChild(name);
			Text tName = doc.createTextNode(studentBean.getName());
			name.appendChild(tName);

			Element age = doc.createElement("年龄");
			student.appendChild(age);
			Text tAge = doc
					.createTextNode(String.valueOf(studentBean.getAge()));
			age.appendChild(tAge);

			Element phone = doc.createElement("电话");
			student.appendChild(phone);
			Text tPhone = doc.createTextNode(studentBean.getPhone());
			phone.appendChild(tPhone);
		}
		// 把XML文档输出到指定的文件
		FileOutputStream outStream = new FileOutputStream(outFile);
		OutputStreamWriter outWriter = new OutputStreamWriter(outStream);
		((XmlDocument) doc).write(outWriter, "GB2312");
		outWriter.close();
		outStream.close();
	}

	// 最后加入测试主函数，如下：
	public static void main(String[] args) throws Exception {
		// 建立测试实例
		W3cDom xmlTest = new W3cDom();
		// 初始化向量列表
		xmlTest.student_Vector = new Vector<StudentBean>();

		System.out.println("开始读Input.xml文件");
		String in  = xmlTest.getClass().getClassLoader().getResource("dom/Input.xml").getFile();
		System.out.println("输入路径:"+in);
		xmlTest.readXMLFile(in);
		System.out.println("读入完毕,开始写Output.xml文件");
		String out = ClassLoader.getSystemResource("dom/Output.xml").getFile();
		System.out.println("输出路径:"+out);
		xmlTest.writeXMLFile(out);
		System.out.println("写入完成");
	}
}

class StudentBean {
	private String sex; // 学生性别
	private String name; // 学生姓名
	private int age; // 学生年龄
	private String phone; // 电话号码

	public void setSex(String s) {
		sex = s;
	}

	public void setName(String s) {
		name = s;
	}

	public void setAge(int a) {
		age = a;
	}

	public void setPhone(String s) {
		phone = s;
	}

	public String getSex() {
		return sex;
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public String getPhone() {
		return phone;
	}
}